package com.seu.vcampus.service;

import com.seu.vcampus.dao.ProductDao;
import com.seu.vcampus.dao.OrderDao;
import com.seu.vcampus.dao.CartItemDao;
import com.seu.vcampus.vo.Product;
import com.seu.vcampus.vo.Order;
import com.seu.vcampus.vo.CartItem;
import com.seu.vcampus.util.IDGenerateUtil;
import java.sql.Connection;
import java.sql.Timestamp;
import java.util.List;

/**
 * 商店服务类
 * 处理商店相关的业务逻辑
 * 
 * @author 虚拟校园开发团队
 * @since 1.0.0
 */

public class ShopService {
	private final ProductDao productDao;
	private final OrderDao orderDao;
	private final CartItemDao cartItemDao;
	
	public ShopService(Connection connection)
	{
		this.productDao = new ProductDao(connection);
		this.orderDao = new OrderDao(connection);
		this.cartItemDao = new CartItemDao(connection);
	}
	
	/**
	 * 获取所有商品 GET_PRODUCTS
	 */
	public List<Product> getAllProducts()
	{
		return productDao.findAll();
	}
	
	/**
	 * 根据ID获取商品（仅管理员可用） GET_PRODUCT_BY_ID
	 */
	public Product getProductById(String pid)
	{
		return productDao.findById(pid);
	}
	
	/**
	 * 根据名字获取商品 GET_PRODUCT_BY_NAME
	 */
	public Product getProductByName(String name)
	{
		return productDao.findByName(name);
	}
	
	/**
	 * 关键词搜索商品 SEARCH_PRODUCT
	 */
	public List<Product> searchProduct(String keywords)
	{
		return productDao.searchProducts(keywords);
	}
	
	/**
	 * 存储商品（仅管理员可用） SAVE_PRODUCT
	 */
	public boolean saveProduct(Product p)
	{
		return productDao.save(p);
	}
	
	/**
	 * 删除商品（仅管理员可用） DELETE_PRODUCT
	 */
	public boolean deleteProduct(String pid)
	{
		return productDao.delete(pid);
	}
	
	/**
	 * 获取商品数量 GET_PRODUCT_COUNT
	 */
	public int getProductCount()
	{
		return productDao.getProductCount();
	}
	
	/**
	 * 更新商品库存（仅管理员可用） UPDATE_PRODUCT_STOCK
	 */
	public boolean updateProductStock(String pid, int stock)
	{
		return productDao.updateProductStock(pid, stock);
	}
	
	/**
	 * 根据订单号查找订单（仅管理员可用） GET_ORDER_BY_ID
	 */
	public Order getOrderById(String oid)
	{
		return orderDao.findById(oid);
	}
	
	/**
	 * 获取用户所有订单 GET_USER_ORDERS
	 */
	public List<Order> getUserOrders(String uid)
	{
		return orderDao.findByUser(uid);
	}
	
	/**
	 * 获取所有订单（仅管理员可用） GET_ALL_ORDERS
	 */
	public List<Order> getAllOrders()
	{
		return orderDao.findAll();
	}
	
	/**
	 * 删除订单（仅管理员可用） DELETE_SINGLE_ORDER
	 */
	public boolean deleteOrder(String oid)
	{
		return orderDao.delete(oid);
	}
	
	/**
	 * 删除用户所有订单（用户注销时使用） DELETE_USER_ORDERS
	 */
	public boolean deleteUserOrders(String uid)
	{
		return orderDao.deleteUserAll(uid);
	}
	
	/**
	 * 获取用户订单数量 GET_USER_ORDER_COUNT
	 */
	public int getUserOrderCount(String uid)
	{
		return orderDao.getUserOrderCount(uid);
	}
	
	/**
	 * 获取用户购物车 GET_USER_CART
	 */
	public List<CartItem> getUserCart(String uid)
	{
		return cartItemDao.findUserAll(uid);
	}
	
	/**
	 * 更新用户购物车内容 UPDATE_USER_CARTITEM
	 */
	public boolean updateUserCartItem(CartItem c)
	{
		return cartItemDao.update(c);
	}
	
	/**
	 * 用户购买商品 BUY_PRODUCT
	 */
	public boolean userBuy(String uid, String pid, int quantity)
	{
		//检查商品是否存在
		Product product = productDao.findById(pid);
		if(product == null)
		{
			return false;
		}
		//检查库存
		if(product.getStock() <= 0)
		{
			return false;
		}
		//生成订单
		String oid = IDGenerateUtil.generate();
		Timestamp timestamp = new Timestamp(System.currentTimeMillis());
		double price = product.getPrice() * quantity;
		Order order = new Order(oid, uid, pid, timestamp, quantity, price);
		
		/**
		 * 此处应有与银行的联动扣款
		 */
		
		boolean success = orderDao.save(order);
		if(!success)
		{
			return false;
		}
		
		return productDao.updateProductStock(pid, product.getStock()-quantity);
	}
	
	/**
	 * 将商品添加到购物车 ADD_TO_CART
	 */
	public boolean addProductToCart(String uid, String pid, int quantity)
	{
		//检查商品是否存在
		Product product = productDao.findById(pid);
		if(product == null)
		{
			return false;
		}
		
		CartItem cartItem = new CartItem(uid, pid, quantity);
		return cartItemDao.save(cartItem);
	}
}
